"""
公共接口层
"""
from db.models import User, FileMixin, Admin, Teacher, Student, School, Course
from lib.utils import prettyprint


def register_interface(obj: User | FileMixin, user_type: int) -> (bool, str):
    """
    公共注册接口
    :param obj: 注册用户对象
    :param user_type: 用户类型 0:管理员 1:教师 2:学生
    :return: (布尔值,消息)
    """
    # 获取对应用户类
    UserClass = Teacher if user_type == 1 else Student if user_type else Admin
    # 用户已存在
    if UserClass.is_exist(obj.name):
        return False, '此用户已存在！'
    # 用户不存在 注册
    obj.save()  # 保存
    return True, f'{obj.name}注册成功！'


def login_interface(username: str, password: str, user_type: int) -> (bool, str):
    """
    公共登录接口
    :param username: 用户名
    :param password: 用户密码
    :param user_type: 用户类型 0:管理员 1:教师 2:学生
    :return: (布尔值,消息)
    """
    # 获取对应用户类
    UserClass = Teacher if user_type == 1 else Student if user_type else Admin
    # 用户不存在
    if not UserClass.is_exist(username):
        return False, '此用户不存在！'
    # 用户存在
    obj = UserClass.read(username)  # 获取用户对象
    if password == obj.password:
        return True, f'{obj.name}登录成功！'
    return False, '密码错误！'


def list_school_interface() -> list[str]:
    """打印所有学校，并返回学校名列表"""
    school_list = School.all_file_list()  # 调用类方法获取全部学校
    if not school_list:  # 如果没有学校返回空列表
        return []

    data = []  # 打印的数据
    for school in school_list:
        data.append([school.name, school.address, school.mail])
    # 打印学校信息列表
    prettyprint(title='所有学校信息', fields=['学校名称', '学校地址', '学校邮箱'], data=data, auto_index=True)

    return [school[0] for school in data]  # 返回所有学校名称列表


def list_course_interface(school_name=None) -> list[str]:
    """打印所有课程或打印学校下课程，并返回课程名列表"""
    data = []
    # 查看学校下的课程
    if school_name:
        school_obj = School.read(school_name)  # 获取学校
        if not school_obj.course_list:  # 学校下的课程为空
            return []

        # 获取课程信息
        for course in school_obj.course_list:
            data.append([course.name, course.price])
            # 打印课程信息列表
        prettyprint(title=f'{school_name}课程信息', fields=['课程名称', '课程价格'], data=data, auto_index=True)
        return [course[0] for course in data]  # 返回所有课程名称列表

    # 查看所有课程
    course_list = Course.all_file_list()  # 调用类方法获取全部课程
    if not course_list:  # 如果没有课程返回空列表
        return []

    for course in course_list:
        data.append([course.name, course.price])
    # 打印学校信息列表
    prettyprint(title='所有课程信息', fields=['课程名称', '课程价格'], data=data, auto_index=True)

    return [course[0] for course in data]  # 返回所有课程名称列表


def list_student_score_interface(course_name):
    """打印课程下学生分数列表，并返回学生名列表"""
    data = []
    course_obj = Course.read(course_name)  # 获取课程
    if not course_obj.student_list:  # 课程下的学生为空
        return []

    # 获取学生信息
    for student in course_obj.student_list:
        data.append([student.name, student.score_dict[course_name]])
    # 打印学生信息列表
    prettyprint(title=f'{course_name}课程的所有学生信息', fields=['姓名', '分数'], data=data, auto_index=True)
    return [student[0] for student in data]  # 返回所有学生名称列表
